﻿using System;
using System.Collections.Generic;

namespace Algorytm
{
    public class Algorytm_Kolejka
    {
        List<Algorytm_Para> lista;
        bool posortowane;

        public Algorytm_Kolejka()
        {
            lista = new List<Algorytm_Para>();
            posortowane = false;
        }

        private int ComparePara(Algorytm_Para x, Algorytm_Para y)
        {
            if (x == null)
            {
                if (y == null)
                    return 0;
                else return -1;
            }
            else
            {
                if (y == null) return 1;
                else
                {
                    if (x.prio == y.prio) return 0;
                    if (x.prio > y.prio) return -1;
                    else return 1;
                }
            }
        }

        public static int ComparePara2(Algorytm_Para x, Algorytm_Para y)
        {
            if (x == null)
            {
                if (y == null)
                    return 0;
                else return -1;
            }
            else
            {
                if (y == null) return 1;
                else
                {
                    if (x.numer < y.numer) return -1;
                    if (x.numer > y.numer) return 1;
                    return 0;
                }
            }
        }

        public void dodaj(int numer, int priorytet)
        {
            posortowane = false;
            lista.Add(new Algorytm_Para(numer, priorytet));
        }

        public int zdejmij()
        {
            if (lista.Count == 0) return -1;
            if (!posortowane)
            {
                lista.Sort(ComparePara);
                posortowane = true;
            }

            int a = lista[0].prio;
            int i;
            for (i = 1; i < lista.Count; i++)
            {
                if (lista[i].prio != a) break;
            }
            Random r = new Random();

            i = r.Next() % i;

            int pom = lista[i].numer;
            lista.RemoveAt(i);

            //int pom = lista[0].numer;
            //lista.RemoveAt(0);
            return pom;
        }

        public bool pusta()
        {
            if (lista.Count == 0) return true;
            else return false;
        }

        public void wyczysc()
        {
            lista.Clear();
        }

        public void Print()
        {
            for (int i = 0; i < lista.Count; i++)
            {
                Algorytm_Tworzenie_dla_Szkoly.p(lista[i].numer + " " + lista[i].prio + " ");
            }
        }
    }
}